package com.ljy.my_study.leetcode.爬楼梯;

/**
 * @author James
 * @date 2018年7月26日
 */
public class TestMain {
	/**
	 * 假设你正在爬楼梯。需要 n 步你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢？ 注意：给定 n 是一个正整数。
	 * 
	 * 思路：到达n层，有两种方式：从N-1上一步，或者从N-2上两部，所以这就是一个斐波那契数列。
	 * 递推公式：f(n) = f(n-1) + f(n - 2);
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		TestMain main=new TestMain();
		int n=10;
		System.out.println(main.climbStairs(n));
		System.out.println(main.test(n));
		System.out.println(main.test2(n));
	}

	public int climbStairs(int n) {
		int[] a = new int[n + 1];
		a[0] = 0;
		if (n > 0) {
			a[1] = 1;
		}
		if (n > 1) {
			a[2] = 2;
		}
		if (n >= 3) {
			for (int i = 3; i < a.length; i++) {
				a[i] = a[i - 1] + a[i - 2];
			}
		}
		return a[n];
	}
	
	public int test(int n) {
		if(n==1) {
			return 1;
		}
		if(n==2) {
			return 2;
		}
		return test(n-1)+test(n-2);
	}
	
	public int test2(int n) {
		int[] arr=new int[n];
		if(n>=1) {
			arr[0]=1;
		}
		if(n>=2) {
			arr[1]=2;
		}
		for(int i=2;i<n;i++) {
			arr[i]=arr[i-1]+arr[i-2];
		}
		return arr[n-1];
	}
	
}
